package com.oig.sys.auth.service.impl;

import com.oig.common.constants.CommonEnum;
import com.oig.common.exception.BadRequestException;
import com.oig.sys.auth.dao.ITbTenantInfoDao;
import com.oig.sys.auth.dto.TenantInfoDto;
import com.oig.sys.auth.entity.TbTenantInfo;
import com.oig.sys.auth.service.ITbTenantInfoService;
import com.oig.sys.auth.vo.TenantInfoVo;
import com.oig.sys.security.util.SecurityUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;


@Service
@Slf4j
@RequiredArgsConstructor
public class TbTenantInfoServiceImpl implements ITbTenantInfoService {

    private final ITbTenantInfoDao tenantInfoDao;

    @Override
    public TenantInfoVo info(Integer id) {
        TbTenantInfo tenantInfo = this.tenantInfoDao.getTbTenantInfoById(id) ;
        if (tenantInfo==null) return null;
        TenantInfoVo tenantInfoVo = new TenantInfoVo();
        BeanUtils.copyProperties(tenantInfo, tenantInfoVo);
        return tenantInfoVo;
    }

    @Override
    public TenantInfoVo getByCode(String code) {
        TbTenantInfo tenantInfo = this.tenantInfoDao.getTbTenantInfoByCode(code);
        if (tenantInfo==null) return null;
        TenantInfoVo tenantInfoVo = new TenantInfoVo();
        BeanUtils.copyProperties(tenantInfo, tenantInfoVo);
        return tenantInfoVo;
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public TenantInfoVo addTenant(TenantInfoDto tenantInfoDto) {
        log.debug("tenantInfo dto:{}",tenantInfoDto);
        TbTenantInfo tenantInfo = new TbTenantInfo();
        //避免复制场景下 传错了id，导致修改了原数据，而不是新增
        BeanUtils.copyProperties(tenantInfoDto, tenantInfo, "id");
        tenantInfo.setCreateTime(new Date());
        tenantInfo.setCreateUserId(SecurityUtil.getDefineUserMain().getId());
        tenantInfo.setCreateUserName(SecurityUtil.getDefineUserMain().getRealName());
        tenantInfo.setStatus(CommonEnum.CommonStatusEnum.OK.getCode());
        tenantInfo = tenantInfoDao.save(tenantInfo);
        TenantInfoVo tenantInfoVo = new TenantInfoVo();
        BeanUtils.copyProperties(tenantInfo, tenantInfoVo);
        return tenantInfoVo ;
    }



    @Transactional(rollbackFor = Exception.class)
    @Override
    public TenantInfoVo updateTenant(TenantInfoDto orgzInfoDto){
        TbTenantInfo tenantInfo = this.tenantInfoDao.getTbTenantInfoById(orgzInfoDto.getId()) ;
        BeanUtils.copyProperties(orgzInfoDto, tenantInfo);
        tenantInfo.setLastUpdateId(SecurityUtil.getDefineUserMain().getId());
        tenantInfo.setLastUpdateName(SecurityUtil.getDefineUserMain().getRealName());
        tenantInfo.setLastUpdateTime(new Date());
        tenantInfo = tenantInfoDao.save(tenantInfo);
        TenantInfoVo tenantInfoVo = new TenantInfoVo();
        BeanUtils.copyProperties(tenantInfo, tenantInfoVo);
        return tenantInfoVo ;
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void cancelTenantInfo(Integer tenantId) {
        TbTenantInfo tenantInfo = this.tenantInfoDao.getTbTenantInfoById(tenantId) ;
        log.debug("entity={}",tenantInfo);
        tenantInfo.setStatus(CommonEnum.CommonStatusEnum.DEL.getCode());
        this.tenantInfoDao.save(tenantInfo) ;
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void revertTenantInfo(Integer tenantId) {
        TbTenantInfo orgzInfo = this.tenantInfoDao.getTbTenantInfoById(tenantId) ;
        if (!CommonEnum.CommonStatusEnum.DEL.getCode().equals(orgzInfo.getStatus())){
            throw new BadRequestException("非注销状态，不需要恢复");
        }
        orgzInfo.setStatus(CommonEnum.CommonStatusEnum.OK.getCode());
        this.tenantInfoDao.save(orgzInfo) ;
    }


    @Override
    public List<TenantInfoVo> findAllList() {
        List<TbTenantInfo> orgzInfoList = this.tenantInfoDao.findOkAll();
        if (orgzInfoList==null||orgzInfoList.isEmpty()){
            return null;
        }
        List<TenantInfoVo> voList = new ArrayList<>();
        orgzInfoList.forEach((tenantInfo)->{
            TenantInfoVo tenantInfoVo = new TenantInfoVo();
            BeanUtils.copyProperties(tenantInfo, tenantInfoVo);
            voList.add(tenantInfoVo);
        });
        return voList;
    }




}
